package entity

import (
	"fmt"
	"time"

	"gorm.io/gorm"
	"shqsoft.cn/pas3ui/base"
	"shqsoft.cn/pas3ui/workflow"
	"shqsoft.cn/pas3ui/workflow/entity"
)

//CompWorkflowUpdate 对公客户认定变更审批
type CompWorkflowUpdate struct {
	ID       int             `gorm:"AUTO_INCREMENT;primary_key;column:ID"`
	ENCD     string          `gorm:"column:ENCD"`
	CUNM     string          `gorm:"column:CUNM"`
	ACNO     string          `gorm:"column:ACNO"`
	BANO     string          `gorm:"column:BANO"`
	CUID     int             `gorm:"column:CUID"`
	ACID     int             `gorm:"column:ACID"`
	EMNO1    string          `gorm:"column:EMNO1"`
	EMID1    int             `gorm:"column:EMID1"`
	EMNM1    string          `gorm:"-" json:"emnm1"`
	DSVL1    float64         `gorm:"column:DSVL1"`
	EMNO2    string          `gorm:"column:EMNO2"`
	EMNM2    string          `gorm:"-" json:"emnm2"`
	EMID2    int             `gorm:"column:EMID2"`
	DSVL2    float64         `gorm:"column:DSVL2"`
	EMNO3    string          `gorm:"column:EMNO3"`
	EMNM3    string          `gorm:"-" json:"emnm3"`
	EMID3    int             `gorm:"column:EMID3"`
	DSVL3    float64         `gorm:"column:DSVL3"`
	EMNO4    string          `gorm:"column:EMNO4"`
	EMNM4    string          `gorm:"-" json:"emnm4"`
	EMID4    int             `gorm:"column:EMID4"`
	DSVL4    float64         `gorm:"column:DSVL4"`
	EMNO5    string          `gorm:"column:EMNO5"`
	EMNM5    string          `gorm:"-" json:"emnm5"`
	EMID5    int             `gorm:"column:EMID5"`
	DSVL5    float64         `gorm:"column:DSVL5"`
	EMNO6    string          `gorm:"column:EMNO6"`
	EMNM6    string          `gorm:"-" json:"emnm6"`
	EMID6    int             `gorm:"column:EMID6"`
	DSVL6    float64         `gorm:"column:DSVL6"`
	UID      int             `gorm:"column:UID"`
	FRID     int             `gorm:"column:FRID"`
	WFID     int             `gorm:"column:WFID"`
	YWLX     string          `gorm:"column:YWLX"`
	ITNM     string          `gorm:"column:ITNM"`
	DSDT     time.Time       `gorm:"column:DSDT"`
	UTNM     string          `gorm:"column:UTNM"`
	SQR      string          `gorm:"column:SQR"`
	SQDT     time.Time       `gorm:"column:SQDT"`
	dbq_divi *base.DiviMap   `gorm:"column:dbq_divi;type:json"`
	STEP     int             `gorm:"-" json:"step"`
	Progress float64         `gorm:"-" json:"progress"`
	StepName string          `gorm:"-" json:"stepName"`
	Status   string          `gorm:"-" json:"status"`
	Bgqdivi  []base.DiviDesc `gorm:"-" json:"Bgqdivi"`
	BeiZhu   string          `gorm:"-" json:"BeiZhu"`
}

//TableName 对公客户认定审批
func (CompWorkflowUpdate) TableName() string {
	return "T_COMP_CLIE_DIVI2"
}

// AfterFind 查询后触发器
func (i *CompWorkflowUpdate) AfterFind(tx *gorm.DB) (err error) {
	i.ACNO = base.CdnoTM(i.ACNO)
	i.BANO = base.AcnoTM(i.BANO)
	ec := base.GetEmployeeCache()
	i.EMNM1, err = ec.GetNameByID(i.EMID1)
	if err != nil {
		return err
	}
	if i.DSVL2 > 0 {
		i.EMNM2, err = ec.GetNameByID(i.EMID2)
		if err != nil {
			return err
		}
	}
	if i.DSVL3 > 0 {
		i.EMNM3, err = ec.GetNameByID(i.EMID3)
		if err != nil {
			return err
		}
	}
	if i.DSVL4 > 0 {
		i.EMNM4, err = ec.GetNameByID(i.EMID4)
		if err != nil {
			return err
		}
	}
	if i.dbq_divi != nil {
		i.Bgqdivi, err = i.dbq_divi.GetDesc()
		if err != nil {
			return err
		}
	}
	if i.WFID == 21 {
		i.BeiZhu = "距离上一次变更在180天之内，需要公司管理部确认提交！"
	}
	if i.FRID == 0 {
		i.Status = "exception"
		i.StepName = "校验错误"
		return
	}
	run := entity.FlowRun{}
	if err = tx.Find(&run, i.FRID).Error; err != nil {
		tx.Rollback()
		return
	}
	wf := workflow.GetWorkFlow(run.WFID)
	if wf == nil {
		return fmt.Errorf("指定的流程ID:%d在流程配置中不存在！", run.WFID)
	}
	act := wf.GetAction(run.Step)
	if act == nil {
		return fmt.Errorf("指定的stepID:%d在流程%s配置中不存在！", run.Step, wf.Name)
	}
	count := len(wf.Actions)
	i.STEP = run.Step
	i.StepName = "审批中"
	if i.STEP == 1 {
		i.StepName = "申请中"
	}
	i.Progress = float64(act.Step*100) / float64(count)
	if i.Progress >= 100 && run.State == "0" {
		i.Progress = 95
	}
	i.Status = ""
	if run.State == "0" {
		i.Status = "active"
	} else if run.State == "2" {
		i.StepName = "已中止"
		i.Status = "exception"
	} else {
		i.StepName = "已完成"
		i.Status = "success"
	}
	return
}

func CompWorkflowUpdateEF() base.EntityFunc {
	return func() interface{} {
		entity := CompWorkflowUpdate{}
		return &entity
	}
}
func CompWorkflowUpdateESF() base.EntitiesFunc {
	return func() interface{} {
		var entities []CompWorkflowUpdate
		return &entities
	}
}

func init() {
	dao := base.NewDefaultDao(CompWorkflowUpdateEF(), CompWorkflowUpdateESF(), nil, "my")
	filter := base.WorkFolowFilter{
		FilterColName: "FRID",
	}
	filter.SetAdditional("wfid", "2,21")
	filter.SetAdditional("manager", "2:30,21:30")
	dao.Fileter = &filter
	dao.Fileter.SetDB("my")
	base.DaoPoolObj.Put("CompWorkflowUpdate", dao)
}
